home *** CD-ROM | disk | FTP | other *** search
Wrap
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head><!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX This file is generated from xml source: DO NOT EDIT XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --> <title>DΘtails sur le fonctionnement des serveurs virtuels - Serveur Apache HTTP</title> <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" /> <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" /> <link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /> <link href="../images/favicon.ico" rel="shortcut icon" /></head> <body id="manual-page"><div id="page-header"> <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p> <p class="apache">Serveur Apache HTTP Version 2.2</p> <img alt="" src="../images/feather.gif" /></div> <div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div> <div id="path"> <a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Serveur HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.2</a> > <a href="./">Serveurs virtuels</a></div><div id="page-content"><div id="preamble"><h1>DΘtails sur le fonctionnement des serveurs virtuels</h1> <div class="toplang"> <p><span>Langues Disponibles: </span><a href="../en/vhosts/details.html" hreflang="en" rel="alternate" title="English"> en </a> | <a href="../fr/vhosts/details.html" title="Franτais"> fr </a> | <a href="../ko/vhosts/details.html" hreflang="ko" rel="alternate" title="Korean"> ko </a></p> </div> <div class="outofdate">Cette traduction peut Ωtre pΘrimΘe. Verifiez la version Anglaise pour les changements rΘcents.</div> <p>Le code gΘrant les serveurs virtuels a ΘtΘ rΘΘcrit α partir de zΘro dans <strong>Apache 1.3</strong>. Ce document vise α expliquer dans le dΘtail comment Apache procΦde lors du choix de l'utilisation d'un serveur virtuel en fonction d'une requΩte reτue. L'apparition de la directive <code class="directive"><a href="../mod/core.html#namevirtualhost">NameVirtualHost</a></code> a rendu beaucoup plus facile et plus s√re la configuration des serveurs virtuels par rapport aux versions prΘcΘdant la 1.3.</p> <p>Si vous voulez juste <cite>que τa marche</cite> sans en comprendre le fonctionnement, voici <a href="examples.html">quelques exemples</a>.</p> </div> <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#configparsing">InterprΘtation des fichiers de configuration</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#hostmatching">Choix du serveur virtuel</a></li> <li><img alt="" src="../images/down.gif" /> <a href="#tips">Trucs et astuces</a></li> </ul></div> <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="configparsing" id="configparsing">InterprΘtation des fichiers de configuration</a></h2> <p>Un <em>serveur principal (main_server)</em> contient toutes les dΘfinitions qui apparaissent en dehors des sections <code><VirtualHost></code>. Les serveurs virtuels, aussi appelΘs <em>vhosts</em> (pour virtual hosts), sont dΘfinis par les sections <code class="directive"><a href="../mod/core.html#virtualhost"><VirtualHost></a></code>.</p> <p>Les directives <code class="directive"><a href="../mod/mpm_common.html#listen">Listen</a></code>, <code class="directive"><a href="../mod/core.html#servername">ServerName</a></code>, <code class="directive"><a href="../mod/core.html#serverpath">ServerPath</a></code>, et <code class="directive"><a href="../mod/core.html#serveralias">ServerAlias</a></code> peuvent Ωtre placΘes n'importe o∙ dans le cadre de dΘfinition d'un serveur. Cependant, chaque fois que l'une d'elles est lue, elle Θcrase ses instances prΘcΘdentes (dans le contexte du mΩme serveur).</p> <p>La valeur par dΘfaut du champ <code>Listen</code> pour le serveur principal est de 80. Le serveur principal n'a pas de valeur par dΘfaut pour <code>ServerPath</code> ni pour <code>ServerAlias</code>. La valeur par dΘfaut de <code>ServerName</code> est dΘduite α partir de l'adresses IP du serveur.</p> <p>La directive Listen associΘe au serveur principal a deux utilitΘs. La premiΦre dΘtermine le port rΘseau sur lequel Apache va Θcouter. La deuxiΦme spΘcifie le port qui sera utilisΘ dans les URIs absolus lors des redirections.</p> <p>└ la diffΘrence du serveur principal, les ports des serveurs virtuels <em>n</em>'affectent <em>pas</em> les ports sur lesquels Apache se met α l'Θcoute.</p> <p>Chaque adresse incluse dans une directive <code>VirtualHost</code> peut disposer d'un port optionnel. Si le port n'est pas prΘcisΘ, il prend par dΘfaut la derniΦre valeur de <code>Listen</code> lue dans la configuration du serveur principal. Le port particulier <code>*</code> reprΘsente un joker qui correspond α tous les ports. L'ensemble des adresses (y compris les rΘsultats multiples <code>A</code> issus des requΩtes DNS) est appelΘ <em>jeu d'adresses</em> du serveur virtuel.</p> <p>└ moins qu'une directive <code class="directive"><a href="../mod/core.html#namevirtualhost">NameVirtualHost</a></code> ne soit utilisΘe pour une adresse IP spΘcifique, le premier serveur virtuel avec cette adresse est considΘrΘ comme un <em>serveur virtuel par-IP</em>. L'adresse IP peut Θgalement prendre la valeur joker <code>*</code>.</p> <p>Dans les cas o∙ l'on souhaite utiliser un <em>serveur virtuel par nom</em>, la directive <code>NameVirtualHost</code> <em>doit</em> apparaεtre avec l'adresse IP choisie. En d'autres termes, vous devez spΘcifier dans votre fichier de configuration l'adresse IP des noms de domaine (CNAME) de vos serveurs virtuels par nom au moyen de la directive <code>NameVirtualHost</code>.</p> <p>On peut utiliser plusieurs directives <code>NameVirtualHost</code> pour un groupe de directives <code>VirtualHost</code>, mais seule une directive <code>NameVirtualHost</code> doit Ωtre utilisΘe pour chaque couple IP:port donnΘ.</p> <p>L'ordre d'apparition des directives <code>NameVirtualHost</code> et <code>VirtualHost</code> est sans importance, ce qui fait que les deux exemples suivants ont des effets identiques (seul l'ordre des directives <code>VirtualHost</code> pour <em>un</em> jeu d'adresses est important, voir ci-dessous) :</p> <table><tr> <td><div class="example"><p><code> NameVirtualHost 111.22.33.44<br /> <VirtualHost 111.22.33.44><br /> # serveur A<br /> ...<br /> </VirtualHost><br /> <VirtualHost 111.22.33.44><br /> # serveur B<br /> ...<br /> </VirtualHost><br /> <br /> NameVirtualHost 111.22.33.55<br /> <VirtualHost 111.22.33.55><br /> # serveur C<br /> ...<br /> </VirtualHost><br /> <VirtualHost 111.22.33.55><br /> # serveur D<br /> ...<br /> </VirtualHost> </code></p></div></td> <td><div class="example"><p><code> <VirtualHost 111.22.33.44><br /> # serveur A<br /> </VirtualHost><br /> <VirtualHost 111.22.33.55><br /> # serveur C<br /> ...<br /> </VirtualHost><br /> <VirtualHost 111.22.33.44><br /> # serveur B<br /> ...<br /> </VirtualHost><br /> <VirtualHost 111.22.33.55><br /> # serveur D<br /> ...<br /> </VirtualHost><br /> <br /> NameVirtualHost 111.22.33.44<br /> NameVirtualHost 111.22.33.55<br /> <br /> </code></p></div></td> </tr></table> <p>(Il est conseillΘ d'adopter le choix de gauche pour faciliter la lisibilitΘ des fichiers de configuration.)</p> <p>AprΦs la lecture de la directive <code>VirtualHost</code>, le serveur virtuel se voit attribuer une valeur <code>Listen</code> par dΘfaut qui est la valeur du port associΘ au premier nom spΘcifiΘ dans sa directive <code>VirtualHost</code>.</p> <p>La liste complΦte des noms d'une directive <code>VirtualHost</code> est gΘrΘe exactement comme des <code>ServerAlias</code> (mais ne sont pas ΘcrasΘs par d'autres <code>ServerAlias</code>) si tous les noms sont rΘsolus dans ce jeu d'adresse. └ noter que les Θtats <code>Listen</code> de ce serveur virtuel sont sans incidence sur les ports attibuΘs au jeu d'adresses.</p> <p>Pendant la phase d'initialisation, une liste de chaque adresse IP est gΘnΘrΘe et introduite dans une table de 'hash'. Si une adresse IP est utilisΘe dans une directive <code>NameVirtualHost</code>, cette liste contient les noms des serveurs virtuels pour cette adresse. Si aucun serveur virtuel n'est dΘfini pour cette adresse, la directive <code>NameVirtualHost</code> est ignorΘe et un message est envoyΘ au journal d'erreurs. Quand un serveur virtuel par IP est utilisΘ, la table de 'hash' reste vide.</p> <p>La fonction de 'hash' Θtant rapide, le temps d'exΘcution d'un 'hash' sur une adresse IP lors d'une requΩte est minimale et quasiment imperceptible. De plus, la table est optimisΘe pour les adresses IP dont le dernier octet est le seul α changer.</p> <p>Pour chaque serveur virtuel, diverses valeurs sont initialisΘes par dΘfaut. En particulier :</p> <ol> <li>Dans le cas o∙ un serveur virtuel ne contient pas de directives <code class="directive"><a href="../mod/core.html#serveradmin">ServerAdmin</a></code>, <code class="directive"><a href="../mod/core.html#resourceconfig">ResourceConfig</a></code>, <code class="directive"><a href="../mod/core.html#accessconfig">AccessConfig</a></code>, <code class="directive"><a href="../mod/core.html#timeout">Timeout</a></code>, <code class="directive"><a href="../mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code>, <code class="directive"><a href="../mod/core.html#keepalive">KeepAlive</a></code>, <code class="directive"><a href="../mod/core.html#maxkeepaliverequests">MaxKeepAliveRequests</a></code>, ou <code class="directive"><a href="../mod/core.html#sendbuffersize">SendBufferSize</a></code>, alors la valeur de chacun de ces paramΦtres est hΘritΘe de celle du serveur principal. (C'est α dire, hΘritΘe de la valeur finale aprΦs lecture de la configuration du serveur principal.)</li> <li>Les permissions par dΘfaut sur les rΘpertoires de chaque serveur virtuel sont assemblΘes avec celles du serveur principal. Elles concernent Θgalement toutes les informations de configuration par rΘpertoire pour tous les modules.</li> <li>Les configurations par serveur pour chaque module sont assemblΘes α partir de celles du serveur principal.</li> </ol> <p>L'essentiel des valeurs de configuration des serveurs virtuels provient de valeurs par dΘfaut issues du serveur principal. Mais la position dans le fichier de configuration des directives du serveur principal n'a pas d'importance -- l'ensemble de la configuration du serveur principal est lu avant que ces valeurs par dΘfaut soient appliquΘes aux serveur virtuels. Ainsi, mΩme si la dΘfinition d'une valeur apparaεt aprΦs celle d'un serveur virtuel, cette valeur peut affecter la definition du serveur virtuel.</p> <p>Dans le cas o∙ le serveur principal n'a pas de <code>ServerName</code> α ce stade, le nom de la machine sur laquelle tourne le programme <code class="program"><a href="../programs/httpd.html">httpd</a></code> est utilisΘ α sa place. Nous appellerons <em>jeu d'adresses du serveur principal</em>, les adresses IP renvoyΘes par une rΘsolution DNS sur le <code>ServerName</code> du serveur principal.</p> <p>Pour tous les champs <code>ServerName</code> non dΘfinis, dans le cas d'une configuration en serveur virtuel par nom, la valeur adoptΘe par dΘfaut est la premiΦre adresse donnΘe dans la section <code>VirtualHost</code> qui dΘfinit le serveur virtuel.</p> <p>Si un serveur virtuel contient la valeur magique <code>_default_</code>, il fonctionne sur le mΩme <code>ServerName</code> que le serveur principal.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="hostmatching" id="hostmatching">Choix du serveur virtuel</a></h2> <p>└ la rΘception d'une requΩte, le serveur procΦde comme suit pour dΘterminer quel serveur virtuel utiliser :</p> <h3><a name="hashtable" id="hashtable">VΘrification dans la table de hash</a></h3> <p>AprΦs que le client se soit connectΘ, l'adresse IP α laquelle le client s'est connectΘ est recherchΘe dans la table de hash IP interne.</p> <p>Si la rΘsolution de l'adresse IP n'aboutit pas (adresse IP non trouvΘe), la requΩte est servie par le serveur virtuel <code>_default_</code> s'il est dΘfini pour le port correspondant α la requΩte. Sinon, elle est servie par le serveur principal.</p> <p>Si l'adresse IP n'est pas trouvΘe dans la table de hash, la recherche du numΘro de port peut aussi se terminer par une correspondance α un <code>NameVirtualHost *</code> qui est gΘrΘ ensuite comme les autres serveur virtuels par noms.</p> <p>Si une liste est bien trouvΘe dans la table pour l'adresse IP recherchΘe, l'Θtape suivante est de dΘterminer s'il s'agit d'un serveur virtuel par nom ou par IP.</p> <h3><a name="ipbased" id="ipbased">Serveur virtuel par IP</a></h3> <p>Si l'entrΘe trouvΘe dispose d'une liste de noms vide, c'est qu'il s'agit d'un serveur virtuel par IP, et aucun autre choix n'est plus α faire ; la requΩte est servie par ce serveur virtuel.</p> <h3><a name="namebased" id="namebased">Serveur virtuel par nom</a></h3> <p>Si l'entrΘe trouvΘe correspond α un serveur virtuel par nom, la liste de noms contient au moins une structure de serveurs virtuels. Les serveurs virtuels se prΘsentent dans cette liste dans le mΩme ordre que la lecture des directives <code>VirtualHost</code> dans le fichier de configuration.</p> <p>Le premier serveur virtuel de cette liste (donc, le premier serveur virtuel attribuΘ α une adresse IP donnΘe dans le fichier de configuration) se voit attribuer la plus grande prioritΘ, ce qui signifie que c'est lui qui traite les requΩtes prΘsentant un nom de serveur invalide ou ne prΘsentant pas de champ <code>Host:</code> dans l'en-tΩte.</p> <p>Si un champ <code>Host:</code> est transmis dans l'en-tΩte de la requΩte, son occurrence est recherchΘe dans la liste et le premier serveur virtuel qui prΘsente un <code>ServerName</code> ou un <code>ServerAlias</code> correspondant est choisi pour servir la requΩte. Il est possible que le champ <code>Host:</code> contienne un numΘro de port, mais Apache utilise toujours le port sur lequel il a effectivement reτu la requΩte.</p> <p>Dans le cas o∙ le client a envoyΘ une requΩte en HTTP/1.0 sans un champ d'en-tΩte <code>Host:</code>, il est impossible de dΘterminer le serveur auquel le client veut se connecter ; l'URI de la requΩte est recherchΘ dans tous les <code>ServerPath</code> existants. Le premier chemin trouvΘ est utilisΘ et la requΩte est servie par le serveur virtuel correspondant.</p> <p>Si aucun serveur virtuel n'est trouvΘ, la requΩte est servie par le premier serveur virtuel qui Θcoute sur le port demandΘ et qui est sur la liste associΘe α l'adresse IP vers laquelle la requΩte a ΘtΘ envoyΘe (comme dΘjα prΘcisΘ ci-avant).</p> <h3><a name="persistent" id="persistent">Connexions persistantes</a></h3> <p>La recherche par adresse IP dΘcrite ci-avant n'est faite qu'<em>une fois</em> pour chaque session TCP/IP, alors que la recherche par nom est rΘalisΘe pour <em>chaque</em> requΩte au cours d'une connexion persistante (KeepAlive). En d'autres termes, il est possible pour un client de faire des requΩtes sur diffΘrents serveurs virtuels par nom, au cours d'une unique connexion persistante.</p> <h3><a name="absoluteURI" id="absoluteURI">URI absolu</a></h3> <p>Au cas o∙ l'URI de la requΩte est absolu, et que son nom de serveur et son port correspondent au serveur principal (ou l'un des serveurs virtuels configurΘs), <em>et</em> qu'ils correspondent α l'adresse et au port de la requΩte, alors l'URI est amputΘ de son prΘfixe protocole/nom de serveur/port et traitΘ par le serveur correspondant (principal ou virtuel). Si cette correspondance n'existe pas, l'URI reste inchangΘ et la requΩte est considΘrΘe comme une requΩte d'un serveur mandataire (proxy).</p> <h3><a name="observations" id="observations">Observations</a></h3> <ul> <li>Les serveurs virtuels par nom et par IP n'interfΦrent jamais entre eux. Les serveurs virtuels par IP ne sont joignables qu'au travers de leur(s) adresse(s) IP propre(s), en aucun cas par aucune autre adresse. Les serveurs virtuels par nom ne sont accessibles que par leur(s) adresse(s) IP qui ne peuvent Ωtre dΘfinies qu'au moyen de la directive <code>NameVirtualHost</code>.</li> <li>Les vΘrifications sur <code>ServerAlias</code> et <code>ServerPath</code> ne sont jamais rΘalisΘes pour les serveurs virtuels par IP.</li> <li>L'ordre dans lequel sont agencΘs dans le fichier de configuration le serveur virtuel <code>_default_</code>, les serveurs virtuels par nom et par IP, et la directive <code>NameVirtualHost</code> est sans incidence sur le fonctionnement. Seul l'ordre des serveurs virtuels par nom pour une adresse donnΘe a une importance. Le serveur virtuel par nom qui est prΘsent en premier dans la configuration se voit attribuΘ la prioritΘ la plus haute pour les requΩtes arrivant sur son jeu d'adresses IP.</li> <li>Pour des raisons de sΘcuritΘ, le numΘro de port prΘsentΘ dans le champ d'en-tΩte <code>Host:</code> n'est jamais utilisΘ pour les tests de correspondances. Apache ne prend en compte que le numΘro de port sur lequel le client a envoyΘ la requΩte.</li> <li>Si une directive <code>ServerPath</code> existe, et se trouve Ωtre prΘfixe d'une autre directive <code>ServerPath</code> qui apparaεt plus loin dans la configuration, la premiΦre sera toujours utilisΘe et la deuxiΦme jamais. (Ceci ne se produit que dans le cas o∙ aucun champ <code>Host:</code> n'a ΘtΘ prΘsentΘ par le client pour distinguer les deux.)</li> <li>Dans le cas o∙ deux serveurs virtuels par IP ont une adresse en commun, le serveur virtuel qui apparaεt en premier dans la configuration est toujours choisi. Ce genre de chose peut arriver par inadvertance. Le serveur envoie une alerte dans le journal d'erreurs si ce cas se prΘsente.</li> <li>Le serveur virtuel <code>_default_</code> ne sert la requΩte que si aucun autre serveur virtuel travaillant sur l'adresse IP <em>et</em> le port demandΘs n'est trouvΘ. La requΩte n'est traitΘe que si le numΘro de port qui a reτu la requΩte est associΘ au serveur virtuel <code>_default_</code> (qui par dΘfaut, correspond α <code>Listen</code>). Un port joker peut Ωtre spΘcifiΘ (<em>comme dans</em> <code>_default_:*</code>) pour rΘcupΘrer les requΩtes sur tous les ports ouverts. Ceci est Θgalement applicable aux serveurs virtuels <code>NameVirtualHost *</code>.</li> <li>Le serveur principal ne sert α servir les requΩtes que lorsque l'adresse IP et le port demandΘs par le client ne correspondent α aucun serveur virtuel (y compris un serveur virtuel <code>_default_</code>). En d'autres termes, le serveur principal n'est utile que pour les combinaisons adresse/port non spΘcifiΘes (sauf quand un serveur virtuel <code>_default_</code> correspond au port).</li> <li>Ni les serveurs virtuels <code>_default_</code>, ni le serveur principal ne sont utilisΘs pour traiter une requΩte avec un champ d'en-tΩte <code>Host:</code> manquant ou vide lorsque l'adresse (et le port) de connexion correspondent α des serveurs virtuels par nom, par exemple, dans une directive <code>NameVirtualHost</code>.</li> <li>Il ne faut jamais employer de noms DNS dans des directives <code>VirtualHost</code>, car cela oblige le serveur a s'appuyer sur le DNS au moment du dΘmarrage. De plus, vous vous exposez α des problΦmes de sΘcuritΘ si vous n'avez pas la maεtrise du DNS pour la totalitΘ de vos domaines. Voir la documentation <a href="../dns-caveats.html">disponible ici</a>, ainsi que les deux points prΘcisΘs ci-aprΦs.</li> <li>Un nom de serveur <code>ServerName</code> devrait toujours Ωtre indiquΘ pour chaque serveur virtuel. Sans cela, une rΘsolution DNS est nΘcessaire pour chaque serveur virtuel.</li> </ul> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> <div class="section"> <h2><a name="tips" id="tips">Trucs et astuces</a></h2> <p>En plus des points ΘvoquΘs sur la page des <a href="../dns-caveats.html#tips">problΦmes liΘs au DNS</a>, voici quelques points intΘressants :</p> <ul> <li>Toujours positionner les dΘfinitions relatives au serveur principal avant toute dΘfinition <code>VirtualHost</code>. (Ceci amΘliore grandement la lisibilitΘ de la configuration -- la maniΦre dont la configuration est interprΘtΘe aprΦs la lecture des fichiers ne met pas en Θvidence le fait que les dΘfinitions positionnΘes avant et surtout aprΦs les serveurs virtuels peuvent impacter le fonctionnement des serveurs virtuels.)</li> <li>Toujours regrouper les dΘfinitions <code>NameVirtualHost</code> et <code>VirtualHost</code> dans la configuration pour une meilleure lisibilitΘ.</li> <li>╔viter les <code>ServerPaths</code> qui sont prΘfixes d'autres <code>ServerPaths</code>. Si cela ne peut Ωtre ΘvitΘ, veillez α ce que le serveur virtuel contenant le prΘfixe le plus long (donc le plus prΘcis) apparaisse dans le fichier de configuration avant le plus court. (<em>par exemple</em>, "ServerPath /abc" est α spΘcifier aprΦs "ServerPath /abc/def").</li> </ul> </div></div> <div class="bottomlang"> <p><span>Langues Disponibles: </span><a href="../en/vhosts/details.html" hreflang="en" rel="alternate" title="English"> en </a> | <a href="../fr/vhosts/details.html" title="Franτais"> fr </a> | <a href="../ko/vhosts/details.html" hreflang="ko" rel="alternate" title="Korean"> ko </a></p> </div><div id="footer"> <p class="apache">Copyright 1995-2006 The Apache Software Foundation or its licensors, as applicable.<br />AuthorisΘ sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p> <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p></div> </body></html>